package base_util

import (
	"fmt"
	"github.com/hashicorp/consul/api"
	"go-likaladi-shop/common/base_config"
	"go.uber.org/zap"
	"os"
	"os/signal"
	"syscall"
)

func ConsulDeregister(serviceID string, client *api.Client) {
	// 处理服务退出时的注销逻辑（仅当服务已注册到 Consul 时）
	if client != nil {
		// 创建一个通道，用于监听系统信号
		quit := make(chan os.Signal)
		signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) // 监听终止信号
		<-quit                                               // 阻塞等待信号

		// 收到终止信号后，注销 Consul 注册的服务
		if err := client.Agent().ServiceDeregister(serviceID); err != nil {
			zap.S().Error("注销失败: " + err.Error())
		} else {
			zap.S().Infof("服务 [%s] 注销成功!", serviceID)
		}
	}
}

func CreateConsulClient(consulConfig base_config.ConsulConfig) *api.Client {
	// 创建 Consul 配置
	// 如果 Consul 是集群部署（如使用负载均衡器 Nginx 或 HAProxy），
	// 需要将 `cfg.Address` 设置为负载均衡器的地址
	cfg := api.DefaultConfig()
	cfg.Address = fmt.Sprintf("%s:%s", consulConfig.Host, consulConfig.Port)

	// 创建 Consul 客户端
	client, err := api.NewClient(cfg)
	if err != nil {
		// 连接 Consul 失败，直接 panic 终止程序
		//zap.S().Fatalf()（会直接 os.Exit(1)，直接退出, 适合初始化）
		zap.S().Fatalf("连接 Consul 注册中心失败: %v", err)
		//panic("连接 Consul 注册中心失败: " + err.Error())
	}

	//zap.S().Fatalf 不会执行返回client, 会直接 os.Exit(1)，直接退出
	return client
}
